/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package CapaDatos;

import CapaDatos.Cliente;
import CapaDatos.CompararCedula;
import CapaDatos.ListaTreeSet;
import java.util.Comparator;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;

/**
 *
 * @author Usuario
 */
public class ListaCliente implements ListaTreeSet {

    public static ListaClientesOrdenadaPorNumReserva losClientesPorNumReserva = new ListaClientesOrdenadaPorNumReserva();
    private SortedSet <Cliente> nodoCliente;
    private Comparator comparadorCedula;


 /**
  * constructor de la clase ListaCliente
  */
      public ListaCliente()
    {
        /*
         Se incializa el comparadorApellido con su constructor y
         * se le pasa al nodoCliente para conocer el criterio
         * de ordenamiento de la lista
         */
        comparadorCedula = new CompararCedula();
        nodoCliente = new TreeSet(comparadorCedula);

    }


    /**
     *Metodo que imprime el contenido de la coleccion
     *
     */
    public void imprimirColeccion()
    {
        int i;
        Cliente registroCliente;


        /*
         * Se define un arreglo de tipo Object (la clase generica Java)
         */
        Object [] arregloCliente;



        /*
         * Se convierte la coleccion pasada como parametro a un array, que
         * es asignado al arreglo de tipo Object
         */
        arregloCliente = nodoCliente.toArray();


        System.out.println("DATOS CLIENTE");
        System.out.println("-------------");

        /*
         * Se hace un recorrido del arreglo de tipo Object y se imprime
         * la informacion de la casilla i
         */
        for(i=0 ; i<arregloCliente.length ; i++)
        {
            registroCliente = (Cliente) arregloCliente[i];
            System.out.println("Nickname: " + registroCliente.getUserName());
            System.out.println("Nombre: " + registroCliente.getNombre());
            System.out.println("Apellido: " + registroCliente.getApellido());
            System.out.println("Cedula: " + registroCliente.getCedula());
            System.out.println("Tipo de Cliente: " + registroCliente.getTipoCliente());
            System.out.println("Fecha de nacimiento: " + registroCliente.getFechaNac());
            System.out.println("Estado Civil: " + registroCliente.getEdoCivil());
            System.out.println("Sexo: " + registroCliente.getSexo());
            System.out.println("Password: " + registroCliente.getPassword());
            System.out.println("Nacionalidad: " + registroCliente.getNacionalidad());

            System.out.println();
        }

    }

    /**
     * firma para agrega el Nodo "objeto" a la coleccion nodoCliente
     * @param objeto objeto de tipo Objeto
     * @return boolean, TRUE si se agrego al cliente y FALSE si no se agrego
     */
    public boolean agregarElemento(Object objeto)
    {
        Cliente elCliente = (Cliente) objeto;
        return nodoCliente.add(elCliente);
    }


   /**
    * firma para eliminar el Nodo "objeto" de la coleccion nodoCliente
    * @param objeto objeto de tipo Objeto
    * @return boolean, TRUE si se pudo eliminar al cliente, FALSE si no se
    * pudo eliminar
    */
    public boolean removerElemento(Object objeto)
    {
        Cliente elCliente = (Cliente) objeto;
        boolean encontrado = false;
        Cliente auxiliar = null;

        /*
         * Se define un iterador inicializado con el iterador de la coleccion
         */
        Iterator iterador = nodoCliente.iterator();

        /*
         * Mientras no se encuentre el elemento y existan mas elementos en la
         * coleccion, se sigue entrando en el ciclo
         */
        while (!encontrado && iterador.hasNext())
        {
            /*
             *  Se obtiene el siguiente objeto del iterador y se le hace un cast
             *  para asignarlo al objeto de tipo Nodo
             */
            auxiliar = (Cliente) iterador.next();

            /*
             * Se invoca al mÃ©todo equals de la clase Nodo para determinar si son
             * iguales. En caso de serlo, se encontrÃ³ el elemento buscado
             */
            if (elCliente.equals(auxiliar))
                encontrado = true;
        }

        /*
         * Si se encontro el elemento, se procede a ejecutar el remove
         */
        if (encontrado)
        {
            if (nodoCliente.remove(auxiliar))
                return true;
        }

        return false;
    }


    /**
     * firma para buscar a un cliente
     * @param cedula la cedula del cliente
     * @return de existir se retorna el Cliente encontrado, de lo contrario
     * se retorna "null"
     */
       public Cliente BuscarCliente (String cedula)
        {

             boolean encontrado = false;
             Cliente auxiliar = null;


               Iterator iterador = nodoCliente.iterator();

        while (!encontrado && iterador.hasNext())
        {

            auxiliar = (Cliente) iterador.next();

            if (auxiliar.getCedula().equals(cedula)==true)
                encontrado= true;
          }
            return auxiliar;
        }

       /**firma para ordenar clientes por el numero de reservas realizadas*/

       public void OrdenarClientesPorNumReserva ()
       {


             boolean encontrado = false;
             Cliente auxiliar = null;


               Iterator iterador = nodoCliente.iterator();

        while (!encontrado && iterador.hasNext())
        {

            auxiliar = (Cliente) iterador.next();
            losClientesPorNumReserva.agregarElemento(auxiliar);

          }

        }

            /**
      * firma para buscar a un cliente por la cedula
      * @param cedula la cedula del cliente
      * @return boolean, TRUE si se encontro al cliente, FALSE si no se encontro
      */

        public Boolean BuscarClientePorCedula (String cedula)
        {

             boolean encontrado = false;
             Cliente auxiliar = null;


               Iterator iterador = nodoCliente.iterator();

        while (!encontrado && iterador.hasNext())
        {

            auxiliar = (Cliente) iterador.next();

            if (auxiliar.getCedula().equals(cedula)==true)
                encontrado= true;
          }
            return encontrado;
        }

        /**
         * firma para elminar a un cliente
         * @param cedula la cedula del cliente
         */

       public void eliminarClientePorCedula (Integer cedula)
        {
         Cliente auxiliar=null;
         auxiliar= BuscarCliente(String.valueOf(cedula));
         nodoCliente.remove(auxiliar);
        }

       /**
        * firma para ver si un cliente esta registrado o no
        * @param userName el userName del cliente
        * @param password la contraseña del cliente
        * @return string, si se encuentra se retorna su cedula de lo contrario
        * se retorna false
        */
       public String esClienteRegistrado(String userName, String password)
       {
             boolean encontrado=false;
             Cliente auxiliar = null;


               Iterator iterador =nodoCliente.iterator();


        while (!encontrado && iterador.hasNext())
        {

            auxiliar = (Cliente) iterador.next();

            if (auxiliar.getUserName().equals(userName)== true && auxiliar.getPassword().equals(password)== true)
            {
                encontrado=true;
                 return auxiliar.getCedula();
            }
       }
       return "false";
      }

}
